2. 名称、赋值与函数 Names, Assignments & Functions

赋值语句的意义:变量名 = 表达式,将表达式的值赋给以变量名为名的变量。赋值是一种进行抽象的手段,可以将一些抽象为名称。

定义函数是一种更为强大的抽象方法,将表达式一系列语句抽象为某个命名下的整体,而无需关注内部细节。

Python 中定义函数的范式:

def <函数名> (<形参表>): # 函数签名
	# 函数体
	...
	return <返回表达式> 

该语句的执行过程如下:

  1. 根据函数签名新建一个函数
  2. 设置函数的主体部分
  3. 将新建好的该函数赋值给函数名

注意新建函数不代表执行函数内的任何语句

调用该函数的过程如下:

  1. 新建一个局部帧(Local Frame) 以形成一个环境。
  2. 在该帧中,将形参表内的形参赋以传入的参数值。
  3. 在新环境中执行函数主体。
该部分内容十分重要,请务必反复温习确保精通相关的知识。

一个环境是一系列的帧,一个帧是名称与值的绑定关系。一个名称在求值时,得到当前环境下最早 查找到 的存在该名称的帧下该名称绑定的值。

以如下代码片段举例:

def square(square):
	return mul(square,square)

该函数可以正常工作并返回某数的平方,这是因为如下图所示,不妨传入参数 2,Python 解释器在对 square(-2) 这一表达式的运算符 square 求值时,我们正处于全局帧下,全局帧下 square 的值为 func mul();而执行函数体,对 mul(-2, -2) 这一表达式求值时,我们处于 square 帧下,此时 square 已经有绑定值,为 2.
Pasted image 20250225151857.png

因此,更具体地来说,赋值语句用于在当前帧中改变名称与值的绑定关系 。 具体执行过程为:

  1. 从左至右逐个求出等号右边所有表达式的值
  2. 将求出的值对应绑定到等号左边给出的名称中

Python 中有一个特殊值 None,即无内容(nothing)。Python 中一个没有明确返回值的函数实际上会返回 None。当 None 作为表达式的值时,Python 解释器不会显示该值。

由此我们可以将函数分为两类:纯函数(Pure Functions)非纯函数(Non-Pure Functions) 。纯函数只会接收参数并返回表达式的值,不产生其它任何影响,例如 abs()pow();非纯函数有输出输出,但同时也有副作用,例如 print()。副作用不是一个值,而是调用一个函数后产生的任何除返回值之外的其它结果。

在了解如下概念后,理解语句 print(print(1), print(2)) 的输出就很简单了。套用表达式的执行过程,我们得到如下结果:Pasted image 20250225195137.png

逻辑运算符 andor 存在 ”短路“ 行为。然而需要注意的是,表达式 <left> and <right> 的值不是简单的真或假。如果表达式 <left> 的值是一个假值(例如 0' 'None),则该表达式的值为表达式 <left> 的值。反之等于表达式 <right> 的值。对于 or 也类似。